/*

Boost Software License - Version 1.0 - August 17th, 2003

Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software, and to permit third-parties to whom the Software is furnished to
do so, all subject to the following:

The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer,
must be included in all copies of the Software, in whole or in part, and
all derivative works of the Software, unless such copies or derivative
works are solely in the form of machine-executable object code generated by
a source language processor.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

*/
module derelict.tcod.types;

private
{
    import core.stdc.config;
}

// libtcod.h
alias ubyte uint8;
alias byte int8;
alias ushort uint16;
alias short int16;
alias uint uint32;
alias int int32;
alias c_long intptr;
alias c_ulong uintptr;

enum TCOD_HEXVERSION = 0x010501;
enum TCOD_STRVERSION = "1.5.1";
enum TCOD_TECHVERSION = 0x01050103;

// bresenham.h
extern(C) alias uint8 function(int, int) TCOD_line_listener_t;

struct TCOD_bresenham_data_t
{
    int stepx;
    int stepy;
    int e;
    int deltax;
    int deltay;
    int origx;
    int origy;
    int destx;
    int desty;
}

// bsp.h
struct TCOD_bsp_t
{
    TCOD_tree_t tree;
    int x, y, w, h;
    int position;
    uint8 level;
    uint8 horizontal;
}

extern(C) alias uint8 function(TCOD_bsp_t*, void*) TCOD_bsp_callback_t;

// color.h
struct TCOD_color_t
{
    uint8 r, g, b;
}

enum
{
    TCOD_COLOR_RED,
    TCOD_COLOR_FLAME,
    TCOD_COLOR_ORANGE,
    TCOD_COLOR_AMBER,
    TCOD_COLOR_YELLOW,
    TCOD_COLOR_LIME,
    TCOD_COLOR_CHARTREUSE,
    TCOD_COLOR_GREEN,
    TCOD_COLOR_SEA,
    TCOD_COLOR_TURQUOISE,
    TCOD_COLOR_CYAN,
    TCOD_COLOR_SKY,
    TCOD_COLOR_AZURE,
    TCOD_COLOR_BLUE,
    TCOD_COLOR_HAN,
    TCOD_COLOR_VIOLET,
    TCOD_COLOR_PURPLE,
    TCOD_COLOR_FUCHSIA,
    TCOD_COLOR_MAGENTA,
    TCOD_COLOR_PINK,
    TCOD_COLOR_CRIMSON,
    TCOD_COLOR_NB
}

enum
{
    TCOD_COLOR_DESATURATED,
    TCOD_COLOR_LIGHTEST,
    TCOD_COLOR_LIGHTER,
    TCOD_COLOR_LIGHT,
    TCOD_COLOR_NORMAL,
    TCOD_COLOR_DARK,
    TCOD_COLOR_DARKER,
    TCOD_COLOR_DARKEST,
    TCOD_COLOR_LEVELS
}

// TCOD exports these colors by value. Rather than redeclare them all here, I've decided to
// load them as pointers. Users need to take this into account when passing them off to
// one of the TCOD_color* functions.
extern(C)
{
    // TODO not sure what to do yet about the TCOD_colors array.
    const(TCOD_color_t*) TCOD_black;
    const(TCOD_color_t*) TCOD_darkest_grey;
    const(TCOD_color_t*) TCOD_darker_grey;
    const(TCOD_color_t*) TCOD_dark_grey;
    const(TCOD_color_t*) TCOD_grey;
    const(TCOD_color_t*) TCOD_light_grey;
    const(TCOD_color_t*) TCOD_lighter_grey;
    const(TCOD_color_t*) TCOD_lightest_grey;
    const(TCOD_color_t*) TCOD_darkest_gray;
    const(TCOD_color_t*) TCOD_darker_gray;
    const(TCOD_color_t*) TCOD_dark_gray;
    const(TCOD_color_t*) TCOD_gray;
    const(TCOD_color_t*) TCOD_light_gray;
    const(TCOD_color_t*) TCOD_lighter_gray;
    const(TCOD_color_t*) TCOD_lightest_gray;
    const(TCOD_color_t*) TCOD_white;

    const(TCOD_color_t*) TCOD_darkest_sepia;
    const(TCOD_color_t*) TCOD_darker_sepia;
    const(TCOD_color_t*) TCOD_dark_sepia;
    const(TCOD_color_t*) TCOD_sepia;
    const(TCOD_color_t*) TCOD_light_sepia;
    const(TCOD_color_t*) TCOD_lighter_sepia;
    const(TCOD_color_t*) TCOD_lightest_sepia;

    const(TCOD_color_t*) TCOD_red;
    const(TCOD_color_t*) TCOD_flame;
    const(TCOD_color_t*) TCOD_orange;
    const(TCOD_color_t*) TCOD_amber;
    const(TCOD_color_t*) TCOD_yellow;
    const(TCOD_color_t*) TCOD_lime;
    const(TCOD_color_t*) TCOD_chartreuse;
    const(TCOD_color_t*) TCOD_green;
    const(TCOD_color_t*) TCOD_sea;
    const(TCOD_color_t*) TCOD_turquoise;
    const(TCOD_color_t*) TCOD_cyan;
    const(TCOD_color_t*) TCOD_sky;
    const(TCOD_color_t*) TCOD_azure;
    const(TCOD_color_t*) TCOD_blue;
    const(TCOD_color_t*) TCOD_han;
    const(TCOD_color_t*) TCOD_violet;
    const(TCOD_color_t*) TCOD_purple;
    const(TCOD_color_t*) TCOD_fuchsia;
    const(TCOD_color_t*) TCOD_magenta;
    const(TCOD_color_t*) TCOD_pink;
    const(TCOD_color_t*) TCOD_crimson;

    const(TCOD_color_t*) TCOD_dark_red;
    const(TCOD_color_t*) TCOD_dark_flame;
    const(TCOD_color_t*) TCOD_dark_orange;
    const(TCOD_color_t*) TCOD_dark_amber;
    const(TCOD_color_t*) TCOD_dark_yellow;
    const(TCOD_color_t*) TCOD_dark_lime;
    const(TCOD_color_t*) TCOD_dark_chartreuse;
    const(TCOD_color_t*) TCOD_dark_green;
    const(TCOD_color_t*) TCOD_dark_sea;
    const(TCOD_color_t*) TCOD_dark_turquoise;
    const(TCOD_color_t*) TCOD_dark_cyan;
    const(TCOD_color_t*) TCOD_dark_sky;
    const(TCOD_color_t*) TCOD_dark_azure;
    const(TCOD_color_t*) TCOD_dark_blue;
    const(TCOD_color_t*) TCOD_dark_han;
    const(TCOD_color_t*) TCOD_dark_violet;
    const(TCOD_color_t*) TCOD_dark_purple;
    const(TCOD_color_t*) TCOD_dark_fuchsia;
    const(TCOD_color_t*) TCOD_dark_magenta;
    const(TCOD_color_t*) TCOD_dark_pink;
    const(TCOD_color_t*) TCOD_dark_crimson;

    const(TCOD_color_t*) TCOD_darker_red;
    const(TCOD_color_t*) TCOD_darker_flame;
    const(TCOD_color_t*) TCOD_darker_orange;
    const(TCOD_color_t*) TCOD_darker_amber;
    const(TCOD_color_t*) TCOD_darker_yellow;
    const(TCOD_color_t*) TCOD_darker_lime;
    const(TCOD_color_t*) TCOD_darker_chartreuse;
    const(TCOD_color_t*) TCOD_darker_green;
    const(TCOD_color_t*) TCOD_darker_sea;
    const(TCOD_color_t*) TCOD_darker_turquoise;
    const(TCOD_color_t*) TCOD_darker_cyan;
    const(TCOD_color_t*) TCOD_darker_sky;
    const(TCOD_color_t*) TCOD_darker_azure;
    const(TCOD_color_t*) TCOD_darker_blue;
    const(TCOD_color_t*) TCOD_darker_han;
    const(TCOD_color_t*) TCOD_darker_violet;
    const(TCOD_color_t*) TCOD_darker_purple;
    const(TCOD_color_t*) TCOD_darker_fuchsia;
    const(TCOD_color_t*) TCOD_darker_magenta;
    const(TCOD_color_t*) TCOD_darker_pink;
    const(TCOD_color_t*) TCOD_darker_crimson;

    const(TCOD_color_t*) TCOD_darkest_red;
    const(TCOD_color_t*) TCOD_darkest_flame;
    const(TCOD_color_t*) TCOD_darkest_orange;
    const(TCOD_color_t*) TCOD_darkest_amber;
    const(TCOD_color_t*) TCOD_darkest_yellow;
    const(TCOD_color_t*) TCOD_darkest_lime;
    const(TCOD_color_t*) TCOD_darkest_chartreuse;
    const(TCOD_color_t*) TCOD_darkest_green;
    const(TCOD_color_t*) TCOD_darkest_sea;
    const(TCOD_color_t*) TCOD_darkest_turquoise;
    const(TCOD_color_t*) TCOD_darkest_cyan;
    const(TCOD_color_t*) TCOD_darkest_sky;
    const(TCOD_color_t*) TCOD_darkest_azure;
    const(TCOD_color_t*) TCOD_darkest_blue;
    const(TCOD_color_t*) TCOD_darkest_han;
    const(TCOD_color_t*) TCOD_darkest_violet;
    const(TCOD_color_t*) TCOD_darkest_purple;
    const(TCOD_color_t*) TCOD_darkest_fuchsia;
    const(TCOD_color_t*) TCOD_darkest_magenta;
    const(TCOD_color_t*) TCOD_darkest_pink;
    const(TCOD_color_t*) TCOD_darkest_crimson;

    const(TCOD_color_t*) TCOD_light_red;
    const(TCOD_color_t*) TCOD_light_flame;
    const(TCOD_color_t*) TCOD_light_orange;
    const(TCOD_color_t*) TCOD_light_amber;
    const(TCOD_color_t*) TCOD_light_yellow;
    const(TCOD_color_t*) TCOD_light_lime;
    const(TCOD_color_t*) TCOD_light_chartreuse;
    const(TCOD_color_t*) TCOD_light_green;
    const(TCOD_color_t*) TCOD_light_sea;
    const(TCOD_color_t*) TCOD_light_turquoise;
    const(TCOD_color_t*) TCOD_light_cyan;
    const(TCOD_color_t*) TCOD_light_sky;
    const(TCOD_color_t*) TCOD_light_azure;
    const(TCOD_color_t*) TCOD_light_blue;
    const(TCOD_color_t*) TCOD_light_han;
    const(TCOD_color_t*) TCOD_light_violet;
    const(TCOD_color_t*) TCOD_light_purple;
    const(TCOD_color_t*) TCOD_light_fuchsia;
    const(TCOD_color_t*) TCOD_light_magenta;
    const(TCOD_color_t*) TCOD_light_pink;
    const(TCOD_color_t*) TCOD_light_crimson;

    const(TCOD_color_t*) TCOD_lighter_red;
    const(TCOD_color_t*) TCOD_lighter_flame;
    const(TCOD_color_t*) TCOD_lighter_orange;
    const(TCOD_color_t*) TCOD_lighter_amber;
    const(TCOD_color_t*) TCOD_lighter_yellow;
    const(TCOD_color_t*) TCOD_lighter_lime;
    const(TCOD_color_t*) TCOD_lighter_chartreuse;
    const(TCOD_color_t*) TCOD_lighter_green;
    const(TCOD_color_t*) TCOD_lighter_sea;
    const(TCOD_color_t*) TCOD_lighter_turquoise;
    const(TCOD_color_t*) TCOD_lighter_cyan;
    const(TCOD_color_t*) TCOD_lighter_sky;
    const(TCOD_color_t*) TCOD_lighter_azure;
    const(TCOD_color_t*) TCOD_lighter_blue;
    const(TCOD_color_t*) TCOD_lighter_han;
    const(TCOD_color_t*) TCOD_lighter_violet;
    const(TCOD_color_t*) TCOD_lighter_purple;
    const(TCOD_color_t*) TCOD_lighter_fuchsia;
    const(TCOD_color_t*) TCOD_lighter_magenta;
    const(TCOD_color_t*) TCOD_lighter_pink;
    const(TCOD_color_t*) TCOD_lighter_crimson;

    const(TCOD_color_t*) TCOD_lightest_red;
    const(TCOD_color_t*) TCOD_lightest_flame;
    const(TCOD_color_t*) TCOD_lightest_orange;
    const(TCOD_color_t*) TCOD_lightest_amber;
    const(TCOD_color_t*) TCOD_lightest_yellow;
    const(TCOD_color_t*) TCOD_lightest_lime;
    const(TCOD_color_t*) TCOD_lightest_chartreuse;
    const(TCOD_color_t*) TCOD_lightest_green;
    const(TCOD_color_t*) TCOD_lightest_sea;
    const(TCOD_color_t*) TCOD_lightest_turquoise;
    const(TCOD_color_t*) TCOD_lightest_cyan;
    const(TCOD_color_t*) TCOD_lightest_sky;
    const(TCOD_color_t*) TCOD_lightest_azure;
    const(TCOD_color_t*) TCOD_lightest_blue;
    const(TCOD_color_t*) TCOD_lightest_han;
    const(TCOD_color_t*) TCOD_lightest_violet;
    const(TCOD_color_t*) TCOD_lightest_purple;
    const(TCOD_color_t*) TCOD_lightest_fuchsia;
    const(TCOD_color_t*) TCOD_lightest_magenta;
    const(TCOD_color_t*) TCOD_lightest_pink;
    const(TCOD_color_t*) TCOD_lightest_crimson;

    const(TCOD_color_t*) TCOD_desaturated_red;
    const(TCOD_color_t*) TCOD_desaturated_flame;
    const(TCOD_color_t*) TCOD_desaturated_orange;
    const(TCOD_color_t*) TCOD_desaturated_amber;
    const(TCOD_color_t*) TCOD_desaturated_yellow;
    const(TCOD_color_t*) TCOD_desaturated_lime;
    const(TCOD_color_t*) TCOD_desaturated_chartreuse;
    const(TCOD_color_t*) TCOD_desaturated_green;
    const(TCOD_color_t*) TCOD_desaturated_sea;
    const(TCOD_color_t*) TCOD_desaturated_turquoise;
    const(TCOD_color_t*) TCOD_desaturated_cyan;
    const(TCOD_color_t*) TCOD_desaturated_sky;
    const(TCOD_color_t*) TCOD_desaturated_azure;
    const(TCOD_color_t*) TCOD_desaturated_blue;
    const(TCOD_color_t*) TCOD_desaturated_han;
    const(TCOD_color_t*) TCOD_desaturated_violet;
    const(TCOD_color_t*) TCOD_desaturated_purple;
    const(TCOD_color_t*) TCOD_desaturated_fuchsia;
    const(TCOD_color_t*) TCOD_desaturated_magenta;
    const(TCOD_color_t*) TCOD_desaturated_pink;
    const(TCOD_color_t*) TCOD_desaturated_crimson;

    const(TCOD_color_t*) TCOD_brass;
    const(TCOD_color_t*) TCOD_copper;
    const(TCOD_color_t*) TCOD_gold;
    const(TCOD_color_t*) TCOD_silver;

    const(TCOD_color_t*) TCOD_celadon;
    const(TCOD_color_t*) TCOD_peach;
}

// console_types.h
alias int TCOD_keycode_t;
enum
{
    TCODK_NONE,
    TCODK_ESCAPE,
    TCODK_BACKSPACE,
    TCODK_TAB,
    TCODK_ENTER,
    TCODK_SHIFT,
    TCODK_CONTROL,
    TCODK_ALT,
    TCODK_PAUSE,
    TCODK_CAPSLOCK,
    TCODK_PAGEUP,
    TCODK_PAGEDOWN,
    TCODK_END,
    TCODK_HOME,
    TCODK_UP,
    TCODK_LEFT,
    TCODK_RIGHT,
    TCODK_DOWN,
    TCODK_PRINTSCREEN,
    TCODK_INSERT,
    TCODK_DELETE,
    TCODK_LWIN,
    TCODK_RWIN,
    TCODK_APPS,
    TCODK_0,
    TCODK_1,
    TCODK_2,
    TCODK_3,
    TCODK_4,
    TCODK_5,
    TCODK_6,
    TCODK_7,
    TCODK_8,
    TCODK_9,
    TCODK_KP0,
    TCODK_KP1,
    TCODK_KP2,
    TCODK_KP3,
    TCODK_KP4,
    TCODK_KP5,
    TCODK_KP6,
    TCODK_KP7,
    TCODK_KP8,
    TCODK_KP9,
    TCODK_KPADD,
    TCODK_KPSUB,
    TCODK_KPDIV,
    TCODK_KPMUL,
    TCODK_KPDEC,
    TCODK_KPENTER,
    TCODK_F1,
    TCODK_F2,
    TCODK_F3,
    TCODK_F4,
    TCODK_F5,
    TCODK_F6,
    TCODK_F7,
    TCODK_F8,
    TCODK_F9,
    TCODK_F10,
    TCODK_F11,
    TCODK_F12,
    TCODK_NUMLOCK,
    TCODK_SCROLLLOCK,
    TCODK_SPACE,
    TCODK_CHAR
}

struct TCOD_key_t
{
    TCOD_keycode_t vk;
    byte c;
    uint8 pressed;
    uint8 lalt;
    uint8 lctrl;
    uint8 ralt;
    uint8 rctrl;
    uint8 shift;
}

alias int TCOD_chars_t;
enum
{
    TCOD_CHAR_HLINE=196,
    TCOD_CHAR_VLINE=179,
    TCOD_CHAR_NE=191,
    TCOD_CHAR_NW=218,
    TCOD_CHAR_SE=217,
    TCOD_CHAR_SW=192,
    TCOD_CHAR_TEEW=180,
    TCOD_CHAR_TEEE=195,
    TCOD_CHAR_TEEN=193,
    TCOD_CHAR_TEES=194,
    TCOD_CHAR_CROSS=197,

    TCOD_CHAR_DHLINE=205,
    TCOD_CHAR_DVLINE=186,
    TCOD_CHAR_DNE=187,
    TCOD_CHAR_DNW=201,
    TCOD_CHAR_DSE=188,
    TCOD_CHAR_DSW=200,
    TCOD_CHAR_DTEEW=185,
    TCOD_CHAR_DTEEE=204,
    TCOD_CHAR_DTEEN=202,
    TCOD_CHAR_DTEES=203,
    TCOD_CHAR_DCROSS=206,

    TCOD_CHAR_BLOCK1=176,
    TCOD_CHAR_BLOCK2=177,
    TCOD_CHAR_BLOCK3=178,

    TCOD_CHAR_ARROW_N=24,
    TCOD_CHAR_ARROW_S=25,
    TCOD_CHAR_ARROW_E=26,
    TCOD_CHAR_ARROW_W=27,

    TCOD_CHAR_ARROW2_N=30,
    TCOD_CHAR_ARROW2_S=31,
    TCOD_CHAR_ARROW2_E=16,
    TCOD_CHAR_ARROW2_W=17,

    TCOD_CHAR_DARROW_H=29,
    TCOD_CHAR_DARROW_V=18,

    TCOD_CHAR_CHECKBOX_UNSET=224,
    TCOD_CHAR_CHECKBOX_SET=225,
    TCOD_CHAR_RADIO_UNSET=9,
    TCOD_CHAR_RADIO_SET=10,

    TCOD_CHAR_SUBP_NW=226,
    TCOD_CHAR_SUBP_NE=227,
    TCOD_CHAR_SUBP_N=228,
    TCOD_CHAR_SUBP_SE=229,
    TCOD_CHAR_SUBP_DIAG=230,
    TCOD_CHAR_SUBP_E=231,
    TCOD_CHAR_SUBP_SW=232,

    TCOD_CHAR_SMILIE = 1,
    TCOD_CHAR_SMILIE_INV = 2,
    TCOD_CHAR_HEART = 3,
    TCOD_CHAR_DIAMOND = 4,
    TCOD_CHAR_CLUB = 5,
    TCOD_CHAR_SPADE = 6,
    TCOD_CHAR_BULLET = 7,
    TCOD_CHAR_BULLET_INV = 8,
    TCOD_CHAR_MALE = 11,
    TCOD_CHAR_FEMALE = 12,
    TCOD_CHAR_NOTE = 13,
    TCOD_CHAR_NOTE_DOUBLE = 14,
    TCOD_CHAR_LIGHT = 15,
    TCOD_CHAR_EXCLAM_DOUBLE = 19,
    TCOD_CHAR_PILCROW = 20,
    TCOD_CHAR_SECTION = 21,
    TCOD_CHAR_POUND = 156,
    TCOD_CHAR_MULTIPLICATION = 158,
    TCOD_CHAR_FUNCTION = 159,
    TCOD_CHAR_RESERVED = 169,
    TCOD_CHAR_HALF = 171,
    TCOD_CHAR_ONE_QUARTER = 172,
    TCOD_CHAR_COPYRIGHT = 184,
    TCOD_CHAR_CENT = 189,
    TCOD_CHAR_YEN = 190,
    TCOD_CHAR_CURRENCY = 207,
    TCOD_CHAR_THREE_QUARTERS = 243,
    TCOD_CHAR_DIVISION = 246,
    TCOD_CHAR_GRADE = 248,
    TCOD_CHAR_UMLAUT = 249,
    TCOD_CHAR_POW1 = 251,
    TCOD_CHAR_POW3 = 252,
    TCOD_CHAR_POW2 = 253,
    TCOD_CHAR_BULLET_SQUARE = 254,
}

alias int TCOD_colctrl_t;
enum
{
    TCOD_COLCTRL_1 = 1,
    TCOD_COLCTRL_2,
    TCOD_COLCTRL_3,
    TCOD_COLCTRL_4,
    TCOD_COLCTRL_5,
    TCOD_COLCTRL_NUMBER=5,
    TCOD_COLCTRL_FORE_RGB,
    TCOD_COLCTRL_BACK_RGB,
    TCOD_COLCTRL_STOP
}

alias int TCOD_bkgnd_flag_t;
enum
{
    TCOD_BKGND_NONE,
    TCOD_BKGND_SET,
    TCOD_BKGND_MULTIPLY,
    TCOD_BKGND_LIGHTEN,
    TCOD_BKGND_DARKEN,
    TCOD_BKGND_SCREEN,
    TCOD_BKGND_COLOR_DODGE,
    TCOD_BKGND_COLOR_BURN,
    TCOD_BKGND_ADD,
    TCOD_BKGND_ADDA,
    TCOD_BKGND_BURN,
    TCOD_BKGND_OVERLAY,
    TCOD_BKGND_ALPH,
    TCOD_BKGND_DEFAULT
}

alias int TCOD_key_status_t;
enum
{
    TCOD_KEY_PRESSED=1,
    TCOD_KEY_RELEASED=2,
}

alias int TCOD_font_flags_t;
enum
{
    TCOD_FONT_LAYOUT_ASCII_INCOL=1,
    TCOD_FONT_LAYOUT_ASCII_INROW=2,
    TCOD_FONT_TYPE_GREYSCALE=4,
    TCOD_FONT_TYPE_GRAYSCALE=4,
    TCOD_FONT_LAYOUT_TCOD=8,
}

alias int TCOD_renderer_t;
enum
{
    TCOD_RENDERER_GLSL,
    TCOD_RENDERER_OPENGL,
    TCOD_RENDERER_SDL,
    TCOD_NB_RENDERERS,
}

alias int TCOD_alignment_t;
enum
{
    TCOD_LEFT,
    TCOD_RIGHT,
    TCOD_CENTER
}

// console.h
alias void* TCOD_console_t;

// fov_types.h
alias int TCOD_fov_algorithm_t;
enum
{
    FOV_BASIC,
    FOV_DIAMOND,
    FOV_SHADOW,
    FOV_PERMISSIVE_0,
    FOV_PERMISSIVE_1,
    FOV_PERMISSIVE_2,
    FOV_PERMISSIVE_3,
    FOV_PERMISSIVE_4,
    FOV_PERMISSIVE_5,
    FOV_PERMISSIVE_6,
    FOV_PERMISSIVE_7,
    FOV_PERMISSIVE_8,
    FOV_RESTRICTIVE,
    NB_FOV_ALGORITHMS
}

// fov.h
alias void* TCOD_map_t;

// heightmap.h
struct TCOD_heightmap_t
{
    int w, h;
    float* values;
}

// image.h
alias void* TCOD_image_t;

// list.h
alias void* TCOD_list_t;

// mersenne_types.h
struct TCOD_dice_t
{
    int nb_rolls;
    int nb_faces;
    float multiplier;
    float addsub;
}

alias int TCOD_random_algo_t;
enum
{
    TCOD_RNG_MT,
    TCOD_RNG_CMWC
}

alias int TCOD_distribution_t;
enum
{
    TCOD_DISTRIBUTION_LINEAR,
    TCOD_DISTRIBUTION_GAUSSIAN,
    TCOD_DISTRIBUTION_GAUSSIAN_RANGE,
    TCOD_DISTRIBUTION_GAUSSIAN_INVERSE,
    TCOD_DISTRIBUTION_GAUSSIAN_RANGE_INVERSE
}

// mersenne.h
alias void* TCOD_random_t;

// mouse_types.h
struct TCOD_mouse_t
{
    int x, y;
    int dx, dy;
    int cx, cy;
    int dcx, dcy;
    bool lbutton;
    bool rbutton;
    bool mbutton;
    bool lbutton_pressed;
    bool rbutton_pressed;
    bool mbutton_pressed;
    bool wheel_up;
    bool wheel_down;
}

// namegen.h
alias void* TCOD_namegen_t;

// noise_defaults.h
enum
{
    TCOD_NOISE_MAX_OCTAVES = 128,
    TCOD_NOISE_MAX_DIMENSIONS = 4,
    TCOD_NOISE_DEFAULT_HURST = 0.5f,
    TCOD_NOISE_DEFAULT_LACURNITY = 2.0f,
}

// noise.h
alias void* TCOD_noise_t;

alias int TCOD_noise_type_t;
enum
{
    TCOD_NOISE_PERLIN = 1,
    TCOD_NOISE_SIMPLEX = 2,
    TCOD_NOISE_WAVELET = 4,
    TCOD_NOISE_DEFAULT = 0
}

// parser.h
alias int TCOD_value_type_t;
enum
{
    TCOD_TYPE_NONE,
    TCOD_TYPE_BOOL,
    TCOD_TYPE_CHAR,
    TCOD_TYPE_INT,
    TCOD_TYPE_FLOAT,
    TCOD_TYPE_STRING,
    TCOD_TYPE_COLOR,
    TCOD_TYPE_DICE,
    TCOD_TYPE_VALUELIST00,
    TCOD_TYPE_VALUELIST01,
    TCOD_TYPE_VALUELIST02,
    TCOD_TYPE_VALUELIST03,
    TCOD_TYPE_VALUELIST04,
    TCOD_TYPE_VALUELIST05,
    TCOD_TYPE_VALUELIST06,
    TCOD_TYPE_VALUELIST07,
    TCOD_TYPE_VALUELIST08,
    TCOD_TYPE_VALUELIST09,
    TCOD_TYPE_VALUELIST10,
    TCOD_TYPE_VALUELIST11,
    TCOD_TYPE_VALUELIST12,
    TCOD_TYPE_VALUELIST13,
    TCOD_TYPE_VALUELIST14,
    TCOD_TYPE_VALUELIST15,
    TCOD_TYPE_CUSTOM00,
    TCOD_TYPE_CUSTOM01,
    TCOD_TYPE_CUSTOM02,
    TCOD_TYPE_CUSTOM03,
    TCOD_TYPE_CUSTOM04,
    TCOD_TYPE_CUSTOM05,
    TCOD_TYPE_CUSTOM06,
    TCOD_TYPE_CUSTOM07,
    TCOD_TYPE_CUSTOM08,
    TCOD_TYPE_CUSTOM09,
    TCOD_TYPE_CUSTOM10,
    TCOD_TYPE_CUSTOM11,
    TCOD_TYPE_CUSTOM12,
    TCOD_TYPE_CUSTOM13,
    TCOD_TYPE_CUSTOM14,
    TCOD_TYPE_CUSTOM15,
    TCOD_TYPE_LIST=1024
}

union TCOD_value_t
{
    uint8 b;
    char c;
    int32 i;
    float f;
    char* s;
    TCOD_color_t col;
    TCOD_dice_t dice;
    TCOD_list_t list;
    void* custom;
}

alias void* TCOD_parser_struct_t;

struct TCOD_parser_listener_t
{
    extern(C)
    {
        nothrow uint8 function(TCOD_parser_struct_t, const(char)*) new_struct;
        nothrow uint8 function(const(char)*) new_flag;
        nothrow uint8 function(const(char)*, TCOD_value_type_t, TCOD_value_t) new_property;
        nothrow uint8 function(TCOD_parser_struct_t, const(char)*) end_property;
        nothrow void function(const(char)*) error;
    }
}

//extern(C) alias TCOD_value_t function(TCOD_lext_t*, TCOD_parser_listener_t*, TCOD_parser_struct_t, char*) TCOD_parser_custom_t;

alias void* TCOD_parser_t;

// path.h
extern(C) alias nothrow float function(int, int, int, int, void*) TCOD_path_func_t;
alias void* TCOD_path_t;
alias void* TCOD_dijkstra_t;

// sys.h
alias int TCOD_event_t;
enum
{
  TCOD_EVENT_KEY_PRESS=1,
  TCOD_EVENT_KEY_RELEASE=2,
  TCOD_EVENT_KEY=TCOD_EVENT_KEY_PRESS|TCOD_EVENT_KEY_RELEASE,
  TCOD_EVENT_MOUSE_MOVE=4,
  TCOD_EVENT_MOUSE_PRESS=8,
  TCOD_EVENT_MOUSE_RELEASE=16,
  TCOD_EVENT_MOUSE=TCOD_EVENT_MOUSE_MOVE|TCOD_EVENT_MOUSE_PRESS|TCOD_EVENT_MOUSE_RELEASE,
  TCOD_EVENT_ANY=TCOD_EVENT_KEY|TCOD_EVENT_MOUSE,
}

alias void* TCOD_thread_t;
alias void* TCOD_semaphore_t;
alias void* TCOD_mutex_t;
alias void* TCOD_cond_t;
alias void* TCOD_library_t;
extern(C) alias nothrow void function(void*) SDL_renderer_t;

// tree.h
struct TCOD_tree_t
{
    TCOD_tree_t* next;
    TCOD_tree_t* father;
    TCOD_tree_t* sons;
}

// txtfield.h
alias void* TCOD_text_t;

// zip.h

alias void* TCOD_zip_t;
